package com.example.meservice.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.meservice.domain.dto.rechargeDTO;
import com.example.meservice.domain.entity.User;
import com.example.meservice.domain.entity.coupon;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 用户个人中心数据访问接口
 * 提供用户信息查询、充值记录、优惠券管理等数据操作
 *
 * @author czwa
 */
@Mapper
public interface MeMapper extends BaseMapper<User> {

    /**
     * 获取当前用户信息
     *
     * @param currentId 当前用户ID
     * @return 用户信息对象（仅返回部分字段）
     */
    @Select("select id,username,image,balance,point,exp,level from user where id = #{currentId}")
    User getMe(Integer currentId);

    /**
     * 添加充值订单记录
     *
     * @param amount 充值金额
     * @param currentId 当前用户ID
     * @param now 充值时间
     */
    @Insert("insert into recharge_order (user_id,amount,create_time) values (#{currentId},#{amount},#{now}) ")
    void addRechargeOrder(double amount, Integer currentId, LocalDateTime now);

    /**
     * 获取用户充值订单列表
     *
     * @param currentId 当前用户ID
     * @return 充值订单DTO列表（按时间倒序）
     */
    @Select("select id,amount,create_time from recharge_order where user_id = #{currentId} order by create_time desc ")
    List<rechargeDTO> getRechargeOrder(Integer currentId);

    /**
     * 更新用户信息
     *
     * @param user 包含更新信息的用户对象
     */
    void updateInformationById(User user);

    /**
     * 获取用户已领取的优惠券数量
     *
     * @param currentId 当前用户ID
     * @return 已领取且有效的优惠券数量
     */
    @Select("select count(id) from coupon_order where user_id=#{currentId} and status=1")
    Integer getCouponCount(Integer currentId);

    /**
     * 获取用户已领取的优惠券列表
     *
     * @param currentId 当前用户ID
     * @return 优惠券实体列表（关联用户领取记录）
     */
    @Select("select c.id,c.name,c.value,c.min_amount,c.start_time,c.end_time,co.id as uid from coupon c left join coupon_order co on c.id=co.coupon_id where co.status=1 and co.user_id=#{currentId}")
    List<coupon> getMyCoupon(Integer currentId);

    /**
     * 检查并更新用户等级
     * 当经验值达到1000时升级并扣除经验值
     *
     * @param currentId 当前用户ID
     */
    @Update("update user set exp=exp-1000, level=level+1 where id=#{currentId} and exp>=1000")
    void checkAndUpdateLevel(Integer currentId);

    /**
     * 添加用户优惠券领取记录
     *
     * @param currentId 当前用户ID
     * @param couponId 优惠券ID
     */
    @Insert("insert into coupon_order (user_id,coupon_id) values (#{currentId},#{couponId})")
    void addCoupon(Integer currentId, int couponId);
}